# 生成器主要是和js类似的yield机制
import sys


def simple_generator():
    """简单的生成器函数"""
    print("1.生成器函数的函数体")
    yield 1
    print("2.开始执行这里")
    yield 2
    print("3.开始执行这里")
    yield 3
    print("4.执行结束")
    return "没有yield来产生值了，直接通过return返回"


#  获得生成器函数，不会进入函数体和执行
get_num_iterator = simple_generator()

normal_list = [i for i in range(10000)]
gen_list = (x for x in range(10000))

list_alloc_size = sys.getsizeof(normal_list)
print("普通列表的占用内存大小=", list_alloc_size)

gen_list = sys.getsizeof(gen_list)
print("生成器的占用内存大小=", gen_list)

try:
    # 启动生成器
    res = next(get_num_iterator)  #   执行到yield 1  处暂停，不再往下执行
    print("res===", res)

    res = next(get_num_iterator)  #   执行到yield 2  处暂停，不再往下执行
    print("res===", res)

    res = next(get_num_iterator)  #   执行到yield 3  处暂停，不再往下执行
    print("res===", res)

    res = next(
        get_num_iterator
    )  #   执行到print("4.执行结束") 因为没有任何return 或者 yiled语句返回值，所以返回值为空
    print("res===", res)

except StopIteration as e:
    print("迭代器已经使用完，不能再迭代了", e)
